package com.pvms.demo;

import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import ucar.ma2.Array;
import ucar.ma2.Index;
import ucar.nc2.Dimension;
import ucar.nc2.NetcdfFile;
import ucar.nc2.Variable;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;

/**
 * @author: wushen
 * @date: Created in 2025/5/15 0:12
 * @description:
 * @mofified By:
 */

public class NetCDFReader {

    public static void main(String[] args) throws IOException {

        /**
         * 使用panoply软件打开NC文件。dtime有24个时间点值，每个值对应一张二维数据表，根据时间点值，可以得到24张二维数据表。
         */

        // 读取文件
        String filePath = "D:\\ws\\soft\\project\\soft\\java\\ncfile_reader\\src\\main\\resources\\题三附件_NMC_HENAN_RH-AVG_L2M_G005_20240312000000_H24_H1.NC"; // 替换为你的NetCDF文件路径

        NetcdfFile ncFile = NetcdfFile.open(filePath);
        // 3. 获取维度信息（经度、纬度、时间）
        Variable lonVar = ncFile.findVariable("lon");
        Variable latVar = ncFile.findVariable("lat");
        Variable dataVar = ncFile.findVariable("data");
        Variable dtimeVar = ncFile.findVariable("dtime");
        if (lonVar == null || latVar == null || dtimeVar == null || dataVar == null) {
            return;
        }
        double[] lons = (double[]) lonVar.read().copyTo1DJavaArray();
        double[] lats = (double[]) latVar.read().copyTo1DJavaArray();
        Array dataVarArr = dataVar.read();
        int[] shape = dataVarArr.getShape();
        ArrayList<LonLatValue> llvList = new ArrayList<>(100);
        //  遍历数据
        for (int dtime = 0; dtime < shape[3]; dtime++) { // dtime 维度
            //一个dttime生成一个excel, dtime值作为excel名称,将llvList的值添加到excel中
            for (int lat = 0; lat < shape[4]; lat++) { // lat 维度
                for (int lon = 0; lon < shape[5]; lon++) { // lon 维度
                    DecimalFormat decimalFormat = new DecimalFormat("0.0");
                    Index factory = Index.factory(shape);
                    factory.set(0, 0, 0, dtime, lat, lon);
                    String formattedNumber = decimalFormat.format(dataVarArr.getFloat(factory));
                    LonLatValue llvObj = new LonLatValue(lats[lat], lons[lon], formattedNumber);
                    llvList.add(llvObj);
                }
            }
            //使用hutool工具类生成excel文件
            BigExcelWriter bigWriter = ExcelUtil.getBigWriter("D:\\ws\\soft\\project\\soft\\java\\ncfile_reader\\src\\main\\resources\\题三附件_NMC_HENAN_RH-AVG_L2M_G005_20240312000000_H24_H1_" + dtime + ".xlsx");
            bigWriter.write(llvList);
            bigWriter.close();
            llvList.clear();
        }
    }
}